import cv2
import numpy as np

#读取图片,opencv支持以下3种 
###- cv2.IMREAD_COLOR：默认参数，读入一副彩色图片，忽略alpha通道 
###- cv2.IMREAD_GRAYSCALE：读入灰度图片 
###- cv2.IMREAD_UNCHANGED：顾名思义，读入完整图片，包括alpha通道
imgName = 'lena.jpg'
img = cv2.imread(imgName)
#显示图片
#cv2.imshow('lena image',img)
#等待键盘输入，单位为毫秒，即等待指定的毫秒数看是否有键盘输入，若在等待时间内按下任意键则返回按键的ASCII码，程序继续运行。
#若没有按下任何键，超时后返回-1。参数为0表示无限等待。
#cv2.waitKey(5000) 

size = img.shape
print(size)

#高斯模糊
#参考原理http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
sigma = 0
gaussImg = cv2.GaussianBlur(img,(11,11),sigma)  #ksize必须是奇数
#cv2.imshow('gauss_img',gaussImg)
#cv2.waitKey(5000) 

# 使用系数进行缩放
# 当系数大于1时，表示放大，小于1时表示缩小。
resizeImg = cv2.resize(img, None, fx=0.2,fy=0.2)
#cv2.imshow('resizeImg',resizeImg)
#cv2.waitKey(5000) 

# 图集
#imgs = np.hstack([img,gaussImg]) #同样尺寸大小的图片，颜色通道一样
#cv2.imshow('multi-imgs',imgs)
#cv2.waitKey(5000) 

#灰度化处理
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv2.imshow('grayImg',grayImg)
#cv2.waitKey(5000)

#二值化处理
# 将一个像素点的值突出为0,255，使得图片呈现黑白两种颜色。在灰度图像中像素值在0~255,二值化后图像中像素值为0或255
# 将大于阈值的灰度值（如设置120）设为最大灰度值，小于阈值的值设为0
ret,thresholdImg=cv2.threshold(grayImg,120,255,cv2.THRESH_BINARY)
#cv2.imshow('thresholdImg',thresholdImg)
#cv2.waitKey(5000)

# R、G、B分量的提取
(B, G, R) = cv2.split(img) # 通道分离，注意顺序BGR不是RGB
# 原图（彩色图像）是三通道图像。而经过cv2.split之后，每个通道是单通道图像。
# 因此需要还原成三通道，只是其他通道都是0
zeros = np.zeros(img.shape[:2], dtype = "uint8")
R1 = cv2.merge([R, zeros, zeros])
G1 = cv2.merge([zeros, G,  zeros])
B1 = cv2.merge([zeros, zeros, B])
#cv2.imshow("Blue", B1)
#cv2.imshow("Green", G1)
#cv2.imshow("Red", R1)
#cv2.waitKey(5000)
#cv2.imshow("Green",G)
#cv2.imshow("Blue",B)
#cv2.waitKey(5000)

#HSV空间
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
H, S, V = cv2.split(hsv)  #分离各个通道
#cv2.imshow("Hue", H)
#cv2.imshow("Saturation", S)
#cv2.imshow("Value", V)
#cv2.waitKey(5000)

#cv2.imshow("HSV",hsv)
#cv2.waitKey(5000)

###################################################################################################

####################################plt 同时显示多幅图像  ############################################

###################################################################################################

import matplotlib.pyplot as plt
# 同时展现多张尺寸不一、颜色通道不一的图片
# 注意：对于opencv的像素是BGR顺序，然而matplotlib所遵循的是RGB顺序。
# opencv的一个像素为：[B,G,R] ,matplotlib的一个像素为：[R,G,B]。这就是为什么本来发红的区域变得有些发蓝了。

#plt.subplot(321),plt.imshow(img),plt.title("img")
#plt.subplot(322),plt.imshow(gaussImg),plt.title("gaussImg")
#plt.subplot(323),plt.imshow(resizeImg),plt.title("resizeImg")
#plt.subplot(324),plt.imshow(grayImg),plt.title("grayImg")
#plt.show()
img1=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gaussImg1=cv2.cvtColor(gaussImg, cv2.COLOR_BGR2RGB)
resizeImg1=cv2.cvtColor(resizeImg, cv2.COLOR_BGR2RGB)
#grayImg1=cv2.cvtColor(grayImg, cv2.COLOR_BGR2RGB)
#thresholdImg1=cv2.cvtColor(thresholdImg, cv2.COLOR_BGR2RGB)

titles = ['original image', 'gaussImg_11', 'resizeImg_0.2', 'grayImg', 'thresholdImg_120','Blue','Green','Red','HSV','Hue','Saturation','Value']
images = [img1, gaussImg1, resizeImg1, grayImg, thresholdImg,B1,G1,R1,hsv,H,S,V]
plt.figure(figsize=(10,8))
for i in range(12):
    plt.subplot(3, 4, i+1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])

plt.show()